import { Settings } from "store/Settings";

export type HTTPRequest = {
    method: string
    path: string
    headers?: Record<string, string | number>
    body?: string
};

// UNSENT = 0; // исходное состояние
// OPENED = 1; // вызван метод open
// HEADERS_RECEIVED = 2; // получены заголовки ответа
// LOADING = 3; // ответ в процессе передачи (данные частично получены)
// DONE = 4; // запрос завершён

export const Http = {
    request<T = unknown>(request: HTTPRequest, callback: (error: Error | null, response: T | string | null) => void) {
        const method = request.method.toUpperCase();

        const xhr = new XMLHttpRequest();

        xhr.timeout = 10000;

        xhr.onload = function() {
            console.log(`Загружено: ${xhr.status} ${xhr.response}`)
        }

        xhr.onerror = function() { // происходит, только когда запрос совсем не получилось выполнить
            console.log(`Ошибка соединения`)
        };

        xhr.onprogress  = function(event) { // происходит, только когда запрос совсем не получилось выполнить
            console.log(`Загружено ${event.loaded} из ${event.total}`)
        };

        xhr.onreadystatechange = function() {
            console.log("Http request onreadystatechange")
                
            // console.log(`onreadystatechange ${xhr.status}`)

            if (xhr.readyState === XMLHttpRequest.DONE) {
                if (xhr.status === 200) {
                    callback(null, xhr.responseText)
                } else {
                    console.log("Http request failed " + xhr.status + ", " + xhr.responseText)
                    callback(new Error(xhr.responseText), null)
                }
            }
        }

        console.log("Http request open")
        xhr.open(method, request.path, true);

        request.headers && Object.keys(request.headers).forEach(key => {
            xhr.setRequestHeader(key, request.headers![key] + "")
        });

        console.log("Http request send")

        if (method === "POST") {
            xhr.send(request.body);
        } else {
            xhr.send();
        }
    },
};

export type Http = typeof Http;